package com.bluebridgecup.SearchBasics;

import java.util.LinkedList;
import java.util.Scanner;

public class 走迷宫 {
    static Scanner in = new Scanner(System.in);
    // 定义一个常量N，用于表示可能的最大节点数，这里设置为1e5+10
    static int N = (int) 1e5 + 10;
    // 二维数组arr用于存储迷宫地图，其中arr[i][j]表示迷宫中第i行第j列的状态
    static int arr[][];
    // x数组用于表示在向上下左右移动是横坐标的变化，-1表示向上，0表示不移动，1表示向下
    static int x[] = {-1, 0, 0, 1};
    // y数组用于表示在向上下左右移动时纵坐标的变化，-1表示向左，0表示不移动，1表示向右
    static int y[] = {0, -1, 1, 0};

    public static void main(String[] args) {
        // n行m列
        int n = in.nextInt();
        int m = in.nextInt();
        // 初始化二维数组arr，大小为(n+1)*(m+1),下标从1开始
        arr = new int[n + 1][m + 1];
        // 循环读取迷宫地图的每一个元素
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                arr[i][j] = in.nextInt();
            }
        }
        LinkedList<int[]> queue = new LinkedList<int[]>();

        // 输入起点坐标和终点坐标
        int x1 = in.nextInt(), y1 = in.nextInt(), x2 = in.nextInt(), y2 = in.nextInt();

        // 将起点坐标做为一个数组添加到队列中，开始搜索
        queue.add(new int[]{x1, y1});
        // 初始化步数计数器，从0开始
        int ans = 0;

        // 当队列不为空时，继续进行搜索
        while (!queue.isEmpty()) {
            // 获取当前队列长度，当前距离起点距离相同的所有结点数量
            int len = queue.size();
            // 循环处理当前队列中的所有结点
            while (len-- != 0) {
                // 从队头取出一个节点，该节点包含坐标
                int t[] = queue.pollFirst();
                // 检查取出的结点是否为终点，如果是则输出步数并结束程序
                if (t[0] == x2 && t[1] == y2) {
                    System.out.println(ans);
                    return;
                }

                // 尝试从上下左右四个方向进行搜索
                for (int i = 0; i < 4; i++) {
                    // 计算新的横坐标，即当前结点横坐标加上x数组中对应方向的偏移量
                    int newX = t[0] + x[i];
                    // 计算新的纵坐标，即当前节点纵坐标加上y数组中对应方向的偏移量
                    int newY = t[1] + y[i];

                    // 判断新的坐标是否越界，如果越界则跳过该方向的搜索
                    if (newX < 1 || newX > n || newY < 1 || newY > m) {
                        continue;
                    }

                    // 判断新坐标是否是可以走的道路(值为1表示可以走)
                    if (arr[newX][newY] == 1) {
                        // 如果可以走，则将新的坐标添加到队列中，以便后续搜索
                        queue.add(new int[]{newX, newY});
                        // 将该位置标记为不能走(值设为0)，防止被其他结点重复访问
                        arr[newX][newY] = 0;
                    }
                }
            }
            // 处理了完当前距离起点相同步数的所有节点后，步数计数器加1
            ans++;
        }
        // 如果循环结束后仍未找到终点，说明无法到达终点，输出-1
        System.out.println(-1);
    }
}
